package org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.futbolista.habilidad;

import org.javahispano.javacup.modelo.ComandoIrA;
import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.futbolista.Futbolista;
import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.futbolista.FutbolistaBase;
import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.util.Balon;
import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.util.PosicionBalon;
import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.util.PosicionCampo;

/**
 * @author Joan Crosas
 *
 */
public class Defender implements Habilidad {
	Futbolista futbolista;

	public Defender( Futbolista futbolista ) {
		this.futbolista = futbolista;
	}

	@Override
	public boolean ejecutar() {
		
		if( futbolista.isPortero() ) {
			Balon balon = futbolista.getVisionPartido().getBalon();
			PosicionBalon posicionBalonEnLineaFondo = balon.getPosicionEnLineaFondo(); 
			if( posicionBalonEnLineaFondo != null &&  posicionBalonEnLineaFondo.isCasiGol() &&
					FutbolistaBase.POSICION_PORTERIA.distancia( balon.getPosicionBalon() ) < FutbolistaBase.DISTANCIA_DEFENSIVA_CRITICA) {
				
				PosicionBalon posicionEnLineaFondo = balon.getPosicionEnLineaFondo();
				futbolista.getVisionPartido().addComando( new ComandoIrA( futbolista.getIndice(), posicionEnLineaFondo.toPosicion() ) );
				
			} else {
				PosicionCampo posicionBalon = futbolista.getVisionPartido().getBalon().getPosicionBalon();
				double angulo = FutbolistaBase.POSICION_BASE_PORTERO.angulo( posicionBalon );
				PosicionCampo posicionPortero = FutbolistaBase.POSICION_BASE_PORTERO.moverAngulo( angulo, 10.0 );
				double posicionBaseX = FutbolistaBase.POSICION_BASE_PORTERO_X;
				double posicionBaseY = FutbolistaBase.POSICION_BASE_PORTERO_Y;
				if( posicionBalon.distancia( FutbolistaBase.POSICION_PORTERIA) < FutbolistaBase.DISTANCIA_DEFENSIVA_CRITICA ) {
					posicionBaseX = FutbolistaBase.POSICION_BASE_PORTERO_CRITICA_X;
					posicionBaseY = FutbolistaBase.POSICION_BASE_PORTERO_CRITICA_Y;
				}
				double posicionPorteroX = posicionPortero.getX();
				double posicionPorteroY = posicionBaseY;
				if( posicionPorteroX > posicionBaseX ) {
					posicionPorteroX = posicionBaseX;
				} else if( posicionPorteroX < -posicionBaseX ) {
					posicionPorteroX = -posicionBaseX;
				}
				
				
				posicionPortero = new PosicionCampo( posicionPorteroX, posicionPorteroY );
				futbolista.getVisionPartido().addComando( new ComandoIrA( futbolista.getIndice(), posicionPortero.toPosicion() ) );
			}
			
			
			
		} else if( futbolista.getOponenteAsignado() != null ) {
			
			PosicionCampo posicionDefensa = futbolista.getOponenteAsignado().getPosicion();
			double distancia = futbolista.getTiempoPresionDefensiva() * futbolista.getVelocidad();
			
			if( futbolista.getZonaCubrirOponente() == 0 ) {
				double angulo = futbolista.getOponenteAsignado().getAnguloPorteria();
				posicionDefensa = posicionDefensa.moverAngulo( angulo, distancia + FutbolistaBase.DISTANCIA_PRESION_OPONENTE );
				
			} else if( futbolista.getZonaCubrirOponente() == 1 ) {
				double angulo = posicionDefensa.angulo( futbolista.getVisionPartido().getBalon().getPosicionBalon() );
				posicionDefensa = posicionDefensa.moverAngulo( angulo, distancia + FutbolistaBase.DISTANCIA_PRESION_OPONENTE );
				angulo = futbolista.getOponenteAsignado().getAnguloPorteria();
				posicionDefensa = posicionDefensa.moverAngulo( angulo, distancia );
				
			} else if( futbolista.getZonaCubrirOponente() == 2 ) {
				double angulo = posicionDefensa.angulo( futbolista.getVisionPartido().getBalon().getPosicionBalon() );
				angulo = corregirAngulo( angulo + Math.PI );
				posicionDefensa = posicionDefensa.moverAngulo( angulo, distancia + FutbolistaBase.DISTANCIA_PRESION_OPONENTE );
				angulo = futbolista.getOponenteAsignado().getAnguloPorteria();
				posicionDefensa = posicionDefensa.moverAngulo( angulo, distancia );
				
			} else if( futbolista.getZonaCubrirOponente() == 3 ) {
				double angulo = futbolista.getOponenteAsignado().getAnguloPorteria();
				angulo = corregirAngulo( angulo + Math.PI );
				posicionDefensa = posicionDefensa.moverAngulo( angulo, distancia + FutbolistaBase.DISTANCIA_PRESION_OPONENTE );
			}
			
			
			futbolista.getVisionPartido().addComando( new ComandoIrA( futbolista.getIndice(), posicionDefensa.setDentroCampoJuego().toPosicion() ) );
			
		} else {
			futbolista.getVisionPartido().addComando( new ComandoIrA( futbolista.getIndice(), futbolista.getPosicionJugada().toPosicion() ) );
		}
		

		return false;
	}
	
	private double corregirAngulo( double angulo ) {
		angulo = angulo % (Math.PI * 2d);
        if (angulo >= Math.PI) {
        	angulo = angulo - 2d * Math.PI;
        }
        return angulo;
		
	}

}
